home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
util
/
pack
/
xpk_Source.lha
/
xpk_Source
/
xpkmaster
/
progress.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-09
|
2KB
|
71 lines
#ifndef XPKMASTER_PROGRESS_C
#define XPKMASTER_PROGRESS_C
/* Routinesheader
Name: progress.c
Main: xpkmaster
Versionstring: $VER: progress.c 1.4 (26.03.1998)
Author: SDI
Distribution: Freeware
Description: Progress report handler
1.0 06.10.96 : first real version
1.1 24.03.97 : added auto hook, changed speed calculation
1.2 25.04.97 : changed time calculation
1.3 09.01.98 : added XPK_ALLINONE
1.4 26.03.98 : a bit shorter exe code
*/
#include <proto/exec.h>
#include <proto/intuition.h>
#include <xpk/xpkprefs.h>
#include "xpkmaster.h"
XPK_ALLINONE LONG callprogress(struct XpkBuffer *xbuf)
{
struct XpkProgress *prog = &xbuf->xb_Prog;
struct Hook *hk = xbuf->xb_ChunkHook;
struct XpkPrefsSemaphore *sem = 0;
if(!hk && (xbuf->xb_Flags & XMF_AUTOPRHOOK) && (sem = GetPrefsSem()))
hk = sem->xps_ProgressHook;
if(hk)
{
ULONG ucur, ulen;
if((ucur = prog->xp_UCur) && (ulen = prog->xp_ULen))
{
ULONG secs;
LONG mics;
CurrentTime (&secs, (ULONG *) &mics);
secs -= xbuf->xb_Secs;
mics -= xbuf->xb_Mics;
/* 7813 = 100000 / 128, 0x20000000 = 0x100000000/128 (ULONG size),
+1 prevents division by zero */
if(ucur < 0x20000000)
prog->xp_Speed = (ucur<<7) / ((secs<<7) + mics/7813 + 1);
else
prog->xp_Speed = ucur / ++secs;
prog->xp_Done = 100 * ucur/ulen;
prog->xp_CF = 100 - 100 * prog->xp_CCur / ucur;
}
if(prog->xp_CF < 0)
prog->xp_CF = 0;
if((*(regfunc) hk->h_Entry) (hk, prog, 0 A4SUPP2))
xbuf->xb_Result = XPKERR_ABORTED;
}
if(sem)
ReleaseSemaphore((struct SignalSemaphore *) sem);
return xbuf->xb_Result;
}
#endif /* XPKMASTER_PROGRESS_C */